home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 December / PCWorld_2007-12_cd.bin / v cisle / htttrack / httrack-3.41-3.exe / {app} / src_win / WinHTTrack / splitter.cpp < prev    next >
C/C++ Source or Header  |  2006-10-01  |  14KB  |  480 lines

  1. // splitter.cpp : implementation file
  2. //
  3.  
  4. #include "resource.h"
  5. #include "stdafx.h"
  6. #include "splitter.h"
  7. #include "DialogContainer.h"
  8. #include "cpp_lang.h"
  9.  
  10. #include "afxpriv.h"
  11.  
  12. // CDirTreeView
  13. #include "DirTreeView.h"
  14.  
  15. // Pointeur sur nous
  16. #include "WinHTTrack.h"
  17. extern CWinHTTrackApp* this_app;
  18.  
  19. extern "C" {
  20.   #include "HTTrackInterface.h"
  21. };
  22.  
  23. //#include "htsbase.h"
  24.  
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char BASED_CODE THIS_FILE[] = __FILE__;
  28. #endif
  29.  
  30. extern "C" {
  31.   #include "HTTrackInterface.h"
  32. };
  33.  
  34. static UINT indicators[] =
  35. {
  36.     ID_SEPARATOR,           // status line indicator
  37.     ID_INDICATOR_CAPS,
  38.     ID_INDICATOR_NUM,
  39.     ID_INDICATOR_SCRL,
  40. };
  41.  
  42. // splitter frame
  43. extern CSplitterFrame* this_CSplitterFrame;
  44. // termine flag
  45. extern int termine;
  46.  
  47. /* DirTreeView */
  48. #include "DirTreeView.h"
  49. extern CDirTreeView* this_DirTreeView;
  50.  
  51.  
  52.  
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CSplitterFrame
  55.  
  56. // Create a splitter window which splits an output text view and an input view
  57. //                           |
  58. //    TEXT VIEW (CTextView)  | INPUT VIEW (CInputView)
  59. //                           |
  60.  
  61. IMPLEMENT_DYNCREATE(CSplitterFrame, CMDIChildWnd)
  62.  
  63. CSplitterFrame::CSplitterFrame()
  64. {
  65.   this_CSplitterFrame=this;
  66. }
  67.  
  68. CSplitterFrame::~CSplitterFrame()
  69. {
  70.   this_CSplitterFrame=NULL;
  71. }
  72.  
  73. #define wm_IcnRest (WM_USER + 16)
  74. BEGIN_MESSAGE_MAP(CSplitterFrame, CMDIChildWnd)
  75.     //{{AFX_MSG_MAP(CSplitterFrame)
  76.     ON_WM_MDIACTIVATE()
  77.     ON_WM_CLOSE()
  78.     //}}AFX_MSG_MAP
  79.   ON_MESSAGE( wm_IcnRest, IconRestore )
  80. END_MESSAGE_MAP()
  81. //
  82.  
  83. // Iconify
  84. void CSplitterFrame::Onhide() 
  85. {
  86.   if (!iconifie) {
  87.     //icnd.hWnd=this->GetMainWnd()->m_hWnd;
  88.     //icnd.hWnd=AfxGetMainWnd()->m_hWnd;
  89.     icnd.hWnd=this_CSplitterFrame->m_hWnd;
  90.     strcpybuff(icnd.szTip,"WinHTTrack Website Copier");
  91.     /* */
  92.     AfxGetMainWnd()->ShowWindow(SW_HIDE);
  93.     //ShowWindow(SW_SHOWMINNOACTIVE);
  94.     Shell_NotifyIcon(NIM_ADD,&icnd);
  95.     iconifie=true;
  96.   } else {
  97.     CheckRestore();
  98.   }
  99. }
  100.  
  101. LRESULT CSplitterFrame::IconRestore(WPARAM wParam,LPARAM lParam) {
  102.   if (iconifie) {
  103.     POINT point;
  104.     GetCursorPos(&point);
  105.     //ScreenToClient(&point);
  106.     int msg=(UINT) lParam;
  107.     if (msg==WM_RBUTTONDOWN) {  // menu      
  108.       CMenu menu;
  109.       VERIFY(menu.LoadMenu(IDR_POPUP));
  110.       CMenu* pPopup = menu.GetSubMenu(0);
  111.       ASSERT(pPopup != NULL); 
  112.       pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,
  113.         point.x, point.y, AfxGetMainWnd());
  114.     } else if (msg==WM_LBUTTONDBLCLK) {
  115.       CheckRestore();
  116.     }
  117.   }
  118.   return 0;
  119. }
  120.  
  121. void CSplitterFrame::IconChange(CString st) {
  122.   if (iconifie) {
  123.     strcpybuff(icnd.szTip,"");
  124.     strncatbuff(icnd.szTip,st,60);
  125.     Shell_NotifyIcon(NIM_MODIFY,&icnd);
  126.   }
  127. }
  128.  
  129. void CSplitterFrame::CheckRestore() {
  130.   if (iconifie) {
  131.     Shell_NotifyIcon(NIM_DELETE,&icnd);
  132.     //if (!termine) {
  133.     if (AfxGetMainWnd()) {
  134.       if (AfxGetMainWnd()->m_hWnd) {
  135.         AfxGetMainWnd()->ShowWindow(SW_RESTORE);
  136.         AfxGetMainWnd()->SetForegroundWindow();
  137.       }
  138.     }
  139.     iconifie=false;
  140.   }
  141. }
  142. // FIN Iconify
  143.  
  144.  
  145. BOOL CSplitterFrame::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle , const RECT& rect , CMDIFrameWnd* pParentWnd , CCreateContext* pContext ) {
  146.   /* recrΘer control tabs */
  147.   this_app->NewTabs();
  148.  
  149.   // Enlever bordure fenΩtre, et mettre en plein Θcran (pas de fenΩtre dans la fenΩtre!!)
  150.   dwStyle&=(~(WS_MINIMIZEBOX|WS_BORDER|WS_CAPTION|WS_OVERLAPPED|WS_OVERLAPPEDWINDOW));
  151.   dwStyle|=(WS_MAXIMIZE);
  152.   int r=CMDIChildWnd::Create(lpszClassName,lpszWindowName,dwStyle ,rect ,pParentWnd ,pContext );
  153.   if (r) {
  154.     // Mettre en maximisΘ
  155.     WINDOWPLACEMENT pl;
  156.     RECT rc;
  157.     rc.top=0;
  158.     rc.left=0;
  159.     rc.bottom=200;
  160.     rc.right=400;
  161.     pl.length=sizeof(pl);
  162.     pl.flags=WPF_RESTORETOMAXIMIZED;
  163.     pl.showCmd=SW_SHOWMAXIMIZED;
  164.     pl.rcNormalPosition=rc;
  165.     SetWindowPlacement(&pl);
  166.   }
  167.  
  168.   // iconification
  169.   iconifie=false;
  170.   icnd.cbSize=sizeof(NOTIFYICONDATA);
  171.   icnd.uID=0;              // euhh id=0
  172.   icnd.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
  173.   icnd.uCallbackMessage=wm_IcnRest;  // notre callback
  174.   icnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  175.  
  176.   // Retourner rΘsultat
  177.   return r;
  178. }
  179.  
  180. static TCHAR BASED_CODE szSection[] = _T("Settings");
  181. static TCHAR BASED_CODE szWindowPos[] = _T("SplitterPos");
  182. BOOL CSplitterFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) 
  183. {
  184.   /*
  185.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  186.         | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  187.         !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  188.     {
  189.         TRACE0("Failed to create toolbar\n");
  190.         return -1;      // fail to create
  191.     }
  192.  
  193.     if (!m_wndStatusBar.Create(this) ||
  194.         !m_wndStatusBar.SetIndicators(indicators,
  195.           sizeof(indicators)/sizeof(UINT)))
  196.     {
  197.         TRACE0("Failed to create status bar\n");
  198.         return -1;      // fail to create
  199.     }
  200.     // TODO: Delete these three lines if you don't want the toolbar to
  201.     //  be dockable
  202.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  203.     EnableDocking(CBRS_ALIGN_ANY);
  204.     DockControlBar(&m_wndToolBar);
  205.   */
  206.   //
  207.  
  208.     // create a splitter with 1 row, 2 columns
  209.     if (!m_wndSplitter.CreateStatic(this, 1, 2))
  210.     {
  211.         TRACE0("Failed to CreateStaticSplitter\n");
  212.         return FALSE;
  213.     }
  214.  
  215.     // add the first splitter pane - the default view in column 0
  216.     /*if (!m_wndSplitter.CreateView(0, 0,
  217.         pContext->m_pNewViewClass, CSize(130, 50), pContext))
  218.     {
  219.         TRACE0("Failed to create first pane\n");
  220.         return FALSE;
  221.     }*/
  222.  
  223.   int PaneW=200,PaneH=50;
  224.   {
  225.     CString strBuffer = AfxGetApp()->GetProfileString(szSection, szWindowPos);
  226.     if (!strBuffer.IsEmpty()) {
  227.       int rx=0,ry=0;
  228.       if (sscanf(strBuffer,"%d,%d",&rx,&ry)==2) {
  229.         PaneW=rx;
  230.         PaneH=ry;
  231.       }
  232.     }
  233.   }
  234.  
  235.     // add the second splitter pane - an input view in column 1
  236.  
  237.     if (!m_wndSplitter.CreateView(0, 0,
  238.         RUNTIME_CLASS(CDirTreeView), CSize(PaneW, PaneH), pContext))
  239.     {
  240.         TRACE0("Failed to create second pane\n");
  241.         return FALSE;
  242.     }
  243.   if (this_DirTreeView)
  244.     this_DirTreeView->docType=".whtt";
  245.  
  246.     // add the second splitter pane - an input view in column 1
  247.     if (!m_wndSplitter.CreateView(0, 1,
  248.         RUNTIME_CLASS(CDialogContainer), CSize(0,0), pContext))
  249.     {
  250.         TRACE0("Failed to create second pane\n");
  251.         return FALSE;
  252.     }
  253.  
  254.   //m_wndSplitter.SetColumnInfo(1,800,400);
  255.  
  256.   // menu entries - done with MDIactivate
  257.   //SetMenuPrefs();
  258.  
  259.   // activate the input view
  260.     SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
  261.  
  262.     return TRUE;
  263. }
  264.  
  265. CSplitterWnd* CSplitterFrame::GetSplitter() {
  266.   return &m_wndSplitter;
  267. }
  268.  
  269. BOOL CSplitterFrame::SetNewView(int row, int col, CRuntimeClass* pViewClass) {
  270.   ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
  271.   
  272.   CView* pView = STATIC_DOWNCAST(CView, m_wndSplitter.GetPane(row, col));
  273.   CFrameWnd* pFrame = pView->GetParentFrame();
  274.   ASSERT(pFrame);
  275.   
  276.   // set up create context to preserve doc/frame etc.
  277.   CCreateContext cc;
  278.   memset(&cc, 0, sizeof(cc));
  279.   cc.m_pNewViewClass = pViewClass;
  280.   cc.m_pCurrentDoc = pView->GetDocument();
  281.   cc.m_pNewDocTemplate = cc.m_pCurrentDoc ?
  282.     cc.m_pCurrentDoc->GetDocTemplate() : NULL;
  283.   cc.m_pCurrentFrame = pFrame;
  284.   
  285.   m_wndSplitter.DeleteView(row, col);                // delete old view
  286.  
  287.   /* */
  288.   /* recrΘer control tabs */
  289.   this_app->NewTabs();
  290.   /* */
  291.  
  292.   VERIFY(m_wndSplitter.CreateView(row, col,          // create new one
  293.     pViewClass,
  294.     CSize(0,0),                      // will fix in RecalcLayout
  295.     &cc));
  296.   
  297.   m_wndSplitter.RecalcLayout();                      // recompute layout 
  298.   
  299.   // initialize the view
  300.   CWnd* pWnd = m_wndSplitter.GetPane(row, col);
  301.   if (pWnd)
  302.     pWnd->SendMessage(WM_INITIALUPDATE);
  303.  
  304.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document vide
  305.   GetActiveDocument()->SetTitle("New Project");
  306.   //SetDefaultTitle(GetActiveDocument());
  307.   return 1;
  308. }
  309.  
  310. BOOL CSplitterFrame::SetSaved() {
  311.   GetActiveDocument()->SetModifiedFlag(FALSE);      // Document sauvΘ
  312.   return 1;
  313. }
  314.  
  315. // Nommer le document
  316. BOOL CSplitterFrame::SetNewName(CString name) {
  317.   GetActiveDocument()->SetPathName(name);
  318.   int pos=max(name.ReverseFind('\\'),name.ReverseFind('/'))+1;
  319.   GetActiveDocument()->SetTitle(name.Mid(pos));
  320.   GetActiveDocument()->SetModifiedFlag();
  321.   return 1;
  322. }
  323.  
  324. BOOL CSplitterFrame::SetCurrentCategory(CString name) {
  325.   m_projcateg = name;
  326.   return TRUE;
  327. }
  328.  
  329. CString CSplitterFrame::GetCurrentCategory() {
  330.   return m_projcateg;
  331. }
  332.  
  333.  
  334. void CSplitterFrame::EnableExtEntries(BOOL state) {
  335.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  336.   if (menu) {
  337.     int status;
  338.     if (!state)
  339.       status=MF_GRAYED; 
  340.     else
  341.       status=MF_ENABLED; 
  342.     menu->EnableMenuItem(2,status|MF_BYPOSITION);
  343.     menu->EnableMenuItem(3,status|MF_BYPOSITION);
  344.     
  345.     GetParent()->GetParent()->DrawMenuBar();
  346.   }
  347. }
  348.  
  349. void CSplitterFrame::EnableSaveEntries(BOOL state) {
  350.   CMenu* menu = GetParent()->GetParent()->GetMenu();
  351.   if (menu) {
  352.     int status;
  353.     if (!state)
  354.       status=MF_GRAYED; 
  355.     else
  356.       status=MF_ENABLED; 
  357.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  358.     menu->EnableMenuItem(1,status|MF_BYPOSITION);
  359.     GetParent()->GetParent()->DrawMenuBar();
  360.   }
  361. }
  362.  
  363. void CSplitterFrame::SetMenuPrefs() {
  364.   if (LANG_T(-1)) {    // Patcher en franτais
  365.     CMenu* menu = GetParent()->GetParent()->GetMenu();
  366.     if (menu) {
  367.       ModifyMenuCP(menu, 0,MF_BYPOSITION,0,LANG(LANG_P1));
  368.       ModifyMenuCP(menu, 1,MF_BYPOSITION,1,LANG(LANG_P2));
  369.       ModifyMenuCP(menu, 2,MF_BYPOSITION,2,LANG(LANG_P3));
  370.       ModifyMenuCP(menu, 3,MF_BYPOSITION,0,LANG(LANG_P4));
  371.       ModifyMenuCP(menu, 4,MF_BYPOSITION,1,LANG(LANG_P5));
  372.       ModifyMenuCP(menu, 5,MF_BYPOSITION,2,LANG(LANG_P6));
  373.       //
  374.       ModifyMenuCP(menu, ID_FILE_NEW ,MF_BYCOMMAND,ID_FILE_NEW,LANG_P18);
  375.       ModifyMenuCP(menu, ID_FILE_OPEN ,MF_BYCOMMAND,ID_FILE_OPEN,LANG_P19);
  376.       ModifyMenuCP(menu, ID_FILE_SAVE ,MF_BYCOMMAND,ID_FILE_SAVE,LANG_P20);
  377.       ModifyMenuCP(menu, ID_FILE_SAVE_AS ,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG_P21);
  378.       ModifyMenuCP(menu, ID_FILE_DELETE_PROJ ,MF_BYCOMMAND,ID_FILE_DELETE_PROJ,LANG_P22);
  379.       ModifyMenuCP(menu, ID_FILE_BROWSE_SIT ,MF_BYCOMMAND,ID_FILE_BROWSE_SIT,LANG_P23);
  380.       ModifyMenuCP(menu, ID_APP_EXIT,MF_BYCOMMAND,ID_APP_EXIT,LANG(LANG_P10));
  381.       ModifyMenuCP(menu, ID_LoadDefaultOptions,MF_BYCOMMAND,ID_LoadDefaultOptions,LANG(LANG_P11));
  382.       ModifyMenuCP(menu, ID_SaveProject,MF_BYCOMMAND,ID_SaveProject,LANG_SAVEPROJECT);
  383.       ModifyMenuCP(menu, ID_NewProjectImport,MF_BYCOMMAND,ID_NewProjectImport,LANG(LANG_P18));
  384.       ModifyMenuCP(menu, ID_SaveDefaultOptions,MF_BYCOMMAND,ID_SaveDefaultOptions,LANG(LANG_P12));
  385.       ModifyMenuCP(menu, ID_ClearDefaultOptions,MF_BYCOMMAND,ID_ClearDefaultOptions,LANG(LANG_P12b));
  386.       ModifyMenuCP(menu, ID_LOAD_OPTIONS,MF_BYCOMMAND,ID_FILE_OPEN,LANG(LANG_P13));
  387.       ModifyMenuCP(menu, ID_FILE_SAVE_OPTIONS_AS,MF_BYCOMMAND,ID_FILE_SAVE_AS,LANG(LANG_P14));
  388.       ModifyMenuCP(menu, IDC_langprefs,MF_BYCOMMAND,IDC_langprefs,LANG(LANG_P15));
  389.       ModifyMenuCP(menu, ID_HELP,MF_BYCOMMAND,ID_HELP,LANG(LANG_P16));
  390.       ModifyMenuCP(menu, IDC_ipabout,MF_BYCOMMAND,IDC_ipabout,LANG(LANG_P17));
  391.       //
  392.       /*
  393.       ModifyMenuCP(menu, 0,MF_BYPOSITION,0,LANG(LANG_O1));
  394.       ModifyMenuCP(menu, 1,MF_BYPOSITION,1,LANG(LANG_O2));
  395.       ModifyMenuCP(menu, 2,MF_BYPOSITION,2,LANG(LANG_O3));
  396.       ModifyMenuCP(menu, 3,MF_BYPOSITION,3,LANG(LANG_O4));
  397.       ModifyMenuCP(menu, 4,MF_BYPOSITION,4,LANG(LANG_O5));
  398.       */
  399.       //
  400.       ModifyMenuCP(menu, ID_FILE_PAUSE,MF_BYCOMMAND,ID_FILE_PAUSE,LANG(LANG_O10));
  401.       ModifyMenuCP(menu, ID_FILE_EXIT,MF_BYCOMMAND,ID_FILE_EXIT,LANG(LANG_O11));
  402.       ModifyMenuCP(menu, ID_OPTIONS_MODIFY,MF_BYCOMMAND,ID_OPTIONS_MODIFY,LANG(LANG_O12));
  403.       ModifyMenuCP(menu, ID_LOG_VIEWLOG,MF_BYCOMMAND,ID_LOG_VIEWLOG,LANG(LANG_O13));
  404.       ModifyMenuCP(menu, ID_LOG_VIEWERRORLOG,MF_BYCOMMAND,ID_LOG_VIEWERRORLOG,LANG(LANG_O14));
  405.       ModifyMenuCP(menu, ID_LOG_VIEWTRANSFERS,MF_BYCOMMAND,ID_LOG_VIEWTRANSFERS,LANG(LANG_O14b));
  406.       ModifyMenuCP(menu, ID_WINDOW_HIDE,MF_BYCOMMAND,ID_WINDOW_HIDE,LANG(LANG_O15));
  407.       //ModifyMenuCP(menu, ID_VIEW_TOOLBAR,MF_BYCOMMAND,ID_VIEW_TOOLBAR,LANG(LANG_O18));
  408.       ModifyMenuCP(menu, ID_VIEW_STATUS_BAR,MF_BYCOMMAND,ID_VIEW_STATUS_BAR,LANG(LANG_O19));
  409.       ModifyMenuCP(menu, ID_WINDOW_SPLIT,MF_BYCOMMAND,ID_WINDOW_SPLIT,LANG(LANG_O20));      
  410.       ModifyMenuCP(menu, ID_ABOUT,MF_BYCOMMAND,ID_ABOUT,LANG(LANG_O16));
  411.       ModifyMenuCP(menu, ID_UPDATE,MF_BYCOMMAND,ID_UPDATE,LANG(LANG_O17));
  412.       //
  413.       GetParent()->GetParent()->DrawMenuBar();
  414.     }
  415.   }
  416. }
  417.  
  418.  
  419. /////////////////////////////////////////////////////////////////////////////
  420. //
  421.  
  422. IMPLEMENT_DYNAMIC(CViewExSplitWnd, CSplitterWnd)
  423.  
  424. CViewExSplitWnd::CViewExSplitWnd()
  425. {
  426. }
  427.  
  428. CViewExSplitWnd::~CViewExSplitWnd()
  429. {
  430. }
  431.  
  432. CWnd* CViewExSplitWnd::GetActivePane(int* pRow, int* pCol)
  433. {
  434.     ASSERT_VALID(this);
  435.  
  436.     // attempt to use active view of frame window
  437.     CWnd* pView = NULL;
  438.     CFrameWnd* pFrameWnd = GetParentFrame();
  439.     ASSERT_VALID(pFrameWnd);
  440.     pView = pFrameWnd->GetActiveView();
  441.  
  442.     // failing that, use the current focus
  443.     if (pView == NULL)
  444.         pView = GetFocus();
  445.  
  446.     return pView;
  447. }
  448.  
  449. //
  450.  
  451. /* Activation du MDI */
  452. void CSplitterFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd) 
  453. {
  454.     CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
  455.   SetMenuPrefs();
  456.   /* disable ext. entries by default */
  457.   this_CSplitterFrame->EnableExtEntries(FALSE);
  458.   this_CSplitterFrame->EnableSaveEntries(TRUE);
  459.  
  460.   if (!bActivate) {
  461.     int cxCur,cxMin;
  462.     TCHAR szBuffer[sizeof("-32767")*8];
  463.     m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  464.     sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  465.       AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  466.   }
  467. }
  468.  
  469.  
  470. void CSplitterFrame::OnClose() 
  471. {
  472.   int cxCur,cxMin;
  473.   TCHAR szBuffer[sizeof("-32767")*8];
  474.   m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
  475.   sprintf(szBuffer,"%d,%d",cxCur,cxMin);
  476.     AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer);
  477.  
  478.     CMDIChildWnd::OnClose();
  479. }
  480.